package com.cx.utils.pinghe.util;

import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.alibaba.fastjson.JSONObject;
import com.cx.utils.pinghe.entity.YxResultDto;
import com.cx.utils.pinghe.entity.YxUserLoginParam;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.*;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;

/**
 * @program: pms
 * @author: cx
 * @description:
 * @create: 2025-01-14 14:29
 **/
public class UtilService {

    //登录 获取TOKEN=========================
    public static Map<String, String> getGoalBasicHeader() {
        YxUserLoginParam yxUserLoginParam = new YxUserLoginParam();
        yxUserLoginParam.setUsername(Constant.goalName);
        yxUserLoginParam.setPassword(Md5Utils.encryption(Constant.goalPassword));

        String result = null;
        try {
            result = HttpsUtil.post(Constant.goalUrl + "/park/website/login", JSONObject.toJSONString(yxUserLoginParam), "application/json", "utf8", 10000, 10000);

            YxResultDto<Map<String, String>> resultDto = JsonUtil.toObject(result, YxResultDto.class);
            String jwt = resultDto.getResult().get("web_authorization");
            String backJwt = resultDto.getResult().get("backend_authorization");
            Map<String, String> header = new HashMap<>();
            header.put(Constant.TOKEN, "Bearer " + jwt);
            header.put(Constant.BACK_TOKEN, backJwt);
            header.put("Cookie", "lang=zh-CN;web_token=" + jwt + ";backend_token=" + backJwt);
            return header;
        } catch (Exception e) {
            Map<String, String> header = new HashMap<>();
            header.put(Constant.TOKEN, "");
            header.put(Constant.BACK_TOKEN, "");

            return header;
        }

    }


    //获取所有的员工
    public static List<Map<String, Object>> getAllStaff() {
        List<Map<String, Object>> result1 = null;
        String getStaffUrl = Constant.goalUrl + "/park/website/staffs";
        try {
            String result = HttpsUtil.get(getStaffUrl, getGoalBasicHeader());
            YxResultDto<List<Map<String, Object>>> yxResultDto = JsonUtil.toObject(result, YxResultDto.class);
            result1 = yxResultDto.getResult();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result1;
    }


    /*
     * @Author Kano
     * @Description //TODO 获取平和所有标签 传0 name在前 传1 ID在前
     * @Date 2020年7月16日15:46:54
     * @Param [type]
     * @return java.util.Map<java.lang.String,java.lang.String>
     **/
    public static Map<String, String> getTags(int type) {
        String labelListUrl = Constant.goalUrl + "/park/website/tags?page=0&size=0";
        String result = null;
        try {
            Map<String, String> headers = new HashMap<>();
            headers.put("Authorization", getGoalBasicHeader().get(Constant.TOKEN));
            headers.put("Backend-Authorization", getGoalBasicHeader().get(Constant.BACK_TOKEN));
            result = HttpsUtil.get(labelListUrl, headers);
        } catch (Exception e) {
            e.printStackTrace();
        }
        YxResultDto<List<HashMap<String, Object>>> resultDto = JsonUtil.toObject(result, YxResultDto.class);
        Map<String, String> labelMap = new HashMap<>();
        List<HashMap<String, Object>> resultList = resultDto.getResult();
        for (int i = 0; i < resultList.size(); i++) {
            List<String> tagTypes = (List<String>) resultList.get(i).get("visible_identity");
            if ("STAFF".equals(tagTypes.get(0))) {
                if (type == 0) {
                    labelMap.put(String.valueOf(resultList.get(i).get("tag_name")), String.valueOf(resultList.get(i).get("tag_id")));
                } else if (type == 1) {
                    labelMap.put(String.valueOf(resultList.get(i).get("tag_id")), String.valueOf(resultList.get(i).get("tag_name")));
                }
            }
        }
        return labelMap;
    }


    /*
     * @Author Kano
     * @Description //TODO 将平和所有教师导出成Excel表
     * @Date 2020年8月11日11:42:50
     * @Param []
     * @return void
     **/
    public static void exportTeacherExcel() {
        List<Map<String, Object>> list = new ArrayList<>();
        int number = 1;
        Map<String, String> tags = getTags(0);
        Map<String, String> tags1 = getTags(1);
        for (Map<String, Object> t : getAllStaff()) {

            StringBuffer tagName = new StringBuffer();
            List<String> tagIdList = (List<String>) t.get("tag_id_list");

            //要学生但是不要初中部的
            //if (tagIdList.contains(tags.get("学生")) && !tagIdList.contains(tags.get("初中部")))
            if (tagIdList.contains(tags.get("九年级")) || tagIdList.contains(tags.get("十年级")) || tagIdList.contains(tags.get("十一年级")) || tagIdList.contains(tags.get("十二年级"))) {
                Map<String, Object> personInformation = (Map<String, Object>) t.get("person_information");

                Map<String, Object> map = new LinkedHashMap<>();
                map.put("序号", number);
                map.put("姓名", personInformation.get("name"));
                map.put("工号", personInformation.get("id"));
                for (String s : tagIdList) {
                   if(tags1.get(s)!=null){
                       tagName.append(tags1.get(s) + ",");
                   }


                }
                map.put("标签", tagName.substring(0, tagName.length() - 1));


                list.add(map);
                number++;
            }
        }
        ExcelWriter writer = ExcelUtil.getWriter("f:/writeTest1.xlsx");
        writer.setColumnWidth(3, 30);
        writer.setColumnWidth(1, 15);
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(list, true);
        // 关闭writer，释放内存
        writer.close();
        System.out.println("Excel表格打印成功");

    }
    /*
     * @Author Kano
     * @Description //TODO 导出高中学生(十一年级，十二年级)Excel表带图片
     * @Date 2020年8月11日11:42:50
     * @Param []
     * @return void
     **/

    public static void exportHighSchool() throws Exception {
        List<Map<String, Object>> list = new ArrayList<>();

        Map<String, String> tags = getTags(0);
        Map<String, String> tags1 = getTags(1);

        //将符合要求的数据添加到list中
        for (Map<String, Object> t : getAllStaff()) {
            List<String> tagIdList = (List<String>) t.get("tag_id_list");
            if (tagIdList.contains(tags.get("十一年级")) || tagIdList.contains(tags.get("十二年级"))|| tagIdList.contains(tags.get("九年级"))|| tagIdList.contains(tags.get("十年级"))) {
                list.add(t);
            }
        }

        // 创建一个新的 Excel 工作簿
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet("Sheet1");  // 使用工作表名称，而非文件名
        //创建首行
        XSSFRow headerRow = sheet.createRow(0);
        XSSFCellStyle style = workbook.createCellStyle();

        // 设置字体加粗
        XSSFFont font = workbook.createFont();
        font.setBold(true);
        style.setFont(font);

        // 设置背景色为灰色 (淡灰色)
        style.setFillForegroundColor(new XSSFColor(new java.awt.Color(211, 211, 211))); // RGB 灰色
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        //设置首行内容
        // 设置标题行的单元格并应用样式
        String[] headers = {"序号", "姓名", "工号", "标签", "人像"};
        for (int i = 0; i < headers.length; i++) {
            XSSFCell cell = headerRow.createCell(i);
            cell.setCellValue(headers[i]);
            cell.setCellStyle(style); // 应用样式
        }
        // 设置第四列的宽度（标签列）
        sheet.setColumnWidth(3, 10000);  // 5000 是一个适当的宽度值，你可以根据需要调整

        sheet.setColumnWidth(4, 2500);  // 5000 是一个适当的宽度值，你可以根据需要调整


        //序号初始化
        int number = 1;

        for (int i = 0; i < list.size(); i++) {
            XSSFRow row = sheet.createRow(i + 1);
            StringBuffer tagName = new StringBuffer();
            //员工标签集合
            List<String> tagIdList = (List<String>) list.get(i).get("tag_id_list");

            //员工信息集合
            Map<String, Object> personInformation = (Map<String, Object>) list.get(i).get("person_information");


            row.createCell(0).setCellValue(number);
            row.createCell(1).setCellValue((String) personInformation.get("name"));
            row.createCell(2).setCellValue((String) personInformation.get("id"));

            for (String s : tagIdList) {

                tagName.append(tags1.get(s) + ",");


            }
            row.createCell(3).setCellValue(tagName.substring(0, tagName.length() - 1));
//            row.createCell(4).setCellValue(number);
//
//            Map<String, Object> map = new LinkedHashMap<>();
//            map.put("序号", number);
//            map.put("姓名", personInformation.get("name"));
//            map.put("工号", personInformation.get("id"));
//            for (String s : tagIdList) {
//
//                tagName.append(tags1.get(s) + ",");
//            }
//            map.put("标签", tagName.substring(0, tagName.length() - 1));
//
//
//            list.add(map);

            //将图片写入本地，然后写进Excel表格
            String fileName = "F:/test/" + number + "_" + new Date().getTime() + personInformation.get("name") + ".jpg";

            //获取人脸id
            List<Map<String, String>> faceList = (List<Map<String, String>>) list.get(i).get("face_list");
            String face_image_id = faceList.get(0).get("face_image_id");

            String url = Constant.goalUrl + "/backend_api/image/" + face_image_id;

            HttpsUtil.downloadFile(url, fileName, getGoalBasicHeader().get("Cookie"));

            //将图片写入excel文件==========================
            FileInputStream imageStream = new FileInputStream(fileName);  // 确保路径正确
            byte[] imageBytes = IOUtils.toByteArray(imageStream);

            // 在 Excel 中添加图片
            int pictureIdx = workbook.addPicture(imageBytes, Workbook.PICTURE_TYPE_JPEG);

            // 创建图片插入的位置
            XSSFDrawing drawing = sheet.createDrawingPatriarch();
            XSSFClientAnchor anchor = new XSSFClientAnchor();

            anchor.setCol1(4);  //设置开始列为第0列（A列）
            anchor.setRow1(i + 1);  //指定了行 1（第0行）
            anchor.setCol2(5);  //设置了图片的结束位置为第5列，即 E 列。
            anchor.setRow2(i + 2);  // 设置图片结束位置为第二行（只占用一行）

            // 插入图片
            drawing.createPicture(anchor, pictureIdx);
            //设置行高
            sheet.getRow(i).setHeightInPoints(50);
            sheet.getRow(i + 1).setHeightInPoints(40);

            number++;
        }

        FileOutputStream fileOut = new FileOutputStream("F:/test/sheet1.xlsx");  // 确保路径存在
        workbook.write(fileOut);
        fileOut.close();

        // 关闭工作簿
        workbook.close();
        System.out.println("图片已成功写入到 Excel 文件中！");


    }

    //图片接口获取图片到本地
    public static void testPicture() throws Exception {
        String fileName = "测试.jpg";
//,getGoalBasicHeader().get("jwt")

        String url = "https://210.22.148.216:11181/backend_api/image/6785d7cc4da6e8000129636b";
        String dirPath = "F:";

        HttpsUtil.downloadFile(url, dirPath + "/" + fileName, getGoalBasicHeader().get("Cookie"));


    }

    //测试图片插入文件夹中，并调整Excel单元格大小
    public static void inPictureTest() {
        try {
            // 创建一个新的 Excel 工作簿
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("Sheet1");  // 使用工作表名称，而非文件名
            // 加载图片
            FileInputStream imageStream = new FileInputStream("F:\\测试.jpg");  // 确保路径正确
            byte[] imageBytes = IOUtils.toByteArray(imageStream);
            // 在 Excel 中添加图片
            int pictureIdx = workbook.addPicture(imageBytes, Workbook.PICTURE_TYPE_JPEG);
            // 创建图片插入的位置
            XSSFDrawing drawing = sheet.createDrawingPatriarch();
            XSSFClientAnchor anchor = new XSSFClientAnchor();
               /*设置 第一行第五列和第二行第五列只占一个单元格：
                setCol1(4)：设置图片的左边起始位置在 E 列。
                setRow1(0)：设置图片的起始行在 第一行。
                setCol2(5)：设置图片的右边界刚好到 E 列 的右边缘。
                setRow2(1)：设置图片的底边紧贴 第一行，使图片不跨越第二行。*/
            anchor.setCol1(4);  //设置开始列为第0列（A列）
            anchor.setRow1(2);  //指定了行 1（第0行）
            anchor.setCol2(5);  //设置了图片的结束位置为第5列，即 E 列。
            anchor.setRow2(3);  // 设置图片结束位置为第二行（只占用一行）

            // 插入图片
            drawing.createPicture(anchor, pictureIdx);

            // 调整列宽和行高，确保图片不会被拉伸或变形
            //sheet.setColumnWidth(0, 256 * 20);  // 设置A列宽度，适应图片
            if (sheet.getRow(0) == null) {
                sheet.createRow(0);  // 如果行不存在，创建该行
            }
            sheet.getRow(0).setHeightInPoints(50);  // 设置行高，适应图片

            // 如果需要，设置其他行列的大小
            //sheet.setColumnWidth(1, 256 * 15);  // 设置B列宽度
            if (sheet.getRow(1) == null) {
                sheet.createRow(1);  // 如果第二行不存在，创建该行
            }
            sheet.getRow(1).setHeightInPoints(40);  // 设置第二行行高

            // 写入 Excel 文件
            FileOutputStream fileOut = new FileOutputStream("F:/test/sheet1.xlsx");  // 确保路径存在
            workbook.write(fileOut);
            fileOut.close();

            // 关闭工作簿
            workbook.close();
            System.out.println("图片已成功写入到 Excel 文件中！");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) throws Exception {
       exportTeacherExcel();

                        /*6495c0029bf7a3000162c868
                         6495bf799bf7a3000162c7b3
                         6495bd6d9bf7a3000162c5c1
                         6495bd6e9bf7a3000162c5c2*/
    /*    Map<String, String> tags = getTags(0);
        List<Map<String, Object>> allStaff = getAllStaff();
        for (Map<String, Object> stringObjectMap : allStaff) {
            Map<String, Object> personInformation = (Map<String, Object>) stringObjectMap.get("person_information");
            if("陈欣诺".equals((String) personInformation.get("name"))){
                List<String> tagIdList = (List<String>) stringObjectMap.get("tag_id_list");
                System.out.println(personInformation.get("name"));
                System.out.println(tagIdList);

                if (tagIdList.contains(tags.get("九年级")) || tagIdList.contains(tags.get("十年级")) || tagIdList.contains(tags.get("十一年级")) || tagIdList.contains(tags.get("十二年级"))) {
                    System.out.println("进来了？？？");
                }



            }

        }*/


    }


}